class FileListPlugin {
    static defaultOptions = {
        outputFile: 'assets.md',
    }

    /** 配置数据，在使用插件，实例化插件时传入
     *
     * @param option
     */
    constructor(option = {}) {
        // 合并配置
        this.options = {
            ...FileListPlugin.defaultOptions,
            option
        }
    }

    apply(compiler) {
        const pluginName = FileListPlugin.name;

        // Webpack模块实例可以从编译器对象compiler中访问
        // 这可以确保使用了正确的Webpack模块版本
        // 不要使用 require/import 导入 webpack
        const { webpack } = compiler;

        // Compilation 对象给我们提供了很多有用的常量
        const { Compilation } = webpack;

        // RawSource 是 "源"类之一，
        // 他应该用来代表编译中的资源源
        const { RawSource } = webpack.sources;

        // 调用 thisCompilation 钩子，为了进一步在编译进程的初期阶段触发回调
        compiler.hooks.thisCompilation.tap(pluginName, (compilation) => {

            // 在资源进程的特定阶段执行回调
            compilation.hooks.processAssets.tap({
                name: pluginName,

                // 使用晚一点的资源处理阶段状态常量，
                // 为了确保所有资源都已经通过其他插件处理添加到编译对象中
                stage: Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE,
            }, assets => {

                // "assets" 是编译对象中一个包含所有资源的资源对象
                // 这个对象的 key 是资源的路径名称，value 是文件源对象
                const content =
                    '# In this build:\n\n' +
                    Object.keys(assets)
                        .map((filename) => `- ${filename}`)
                        .join('\n');

                // 添加一个新的资源对象到编译对象中
                // 因此他将自动生成到 webpack 的 输出目录中
                compilation.emitAsset(
                    this.options.outputFile,
                    new RawSource(content)
                );


            })
        })
    }

}
module.exports = {
    FileListPlugin
}
